package com.yjzx.care.base;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

/**
 * @author yjzx
 * @date 2023/12/25
 * @description 泛型获取抽象基类
 * 接口获取泛型可能出现获取多个接口的实现泛型
 */
public abstract class BaseClass<T> {
    /**
     * 获取当前抽象类的泛型
     * @return 实现类的泛型class对象
     */
    public Class<T> getGenericityClass() {
        Type type = this.getClass().getGenericSuperclass();
        Class<?> clazz = null;
        //接口的的泛型
        Type[] arguments = ((ParameterizedType) type).getActualTypeArguments();
        if (arguments.length == 1) {
            Type type1 = arguments[0];
            if (Class.class.isAssignableFrom(type1.getClass())) {
                // T 无泛型获取
                clazz = (Class<?>) type1;
            } else if (ParameterizedType.class.isAssignableFrom(type1.getClass())) {
                // T 有泛型获取
                ParameterizedType argument = (ParameterizedType) type1;
                clazz = (Class<?>) argument.getRawType();
            }
        }
        return (Class<T>)clazz;
    }
}
